﻿
#include "zyPanel.h"

DarkMoonUI::zyPanel::zyPanel()
{
	SetMember(L"this", (LONG_PTR)this);
	m_obj->setWndProc(zyPanel_WndProc);
	m_obj->setDestroy(zyPanel_Destroy);
}
void DarkMoonUI::zyPanel::OnNCDestroy()
{
	LONG_PTR pBackImage = GetMember(L"pBackImage");
	if (pBackImage != 0) {

		SetMember(L"pBackImage", 0);
	}
}
void WINAPI DarkMoonUI::zyPanel::zyPanel_Destroy(zyObject* obj)
{
	zyPanel* zyb = (zyPanel*)obj->getPtrData(L"this");
	zyb->OnNCDestroy();
	zyForm::zyWindow_Destroy(obj);
}
LRESULT WINAPI DarkMoonUI::zyPanel::zyPanel_WndProc(zyObject* obj, HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL* bHandled)
{
	if (uMsg == WM_NCDESTROY) {
		zyPanel* zyb = (zyPanel*)obj->getPtrData(L"this");
		zyb->OnNCDestroy();
	}
	else if (uMsg == WM_ERASEBKGND) {
		zyPanel* zyb = (zyPanel*)obj->getPtrData(L"this");
		if (zyb->OnDrawBack(hWnd, (HDC)wParam)) {
			*bHandled = true;
			return 1;
		}
	}
	else if (uMsg == WM_CREATE || uMsg == WM_INITDIALOG) {
		TRegEvent* evtPtr = reinterpret_cast<TRegEvent*>(obj->getRegEvent(L"OnCreate"));
		if (evtPtr != nullptr)
			evtPtr->handler<int>(hWnd);
	}
	else if (uMsg == WM_SIZE) {
		TRegEvent* evtPtr = reinterpret_cast<TRegEvent*>(obj->getRegEvent(L"OnSize"));
		if (evtPtr != nullptr)
			evtPtr->handler<int>(hWnd, LOWORD(lParam), HIWORD(lParam));
	}
	return zyForm::zyWindow_WndProc(obj, hWnd, uMsg, wParam, lParam, bHandled);
}
BOOL DarkMoonUI::zyPanel::创建(HWND 参数_父窗口, const std::wstring& 参数_标题, POINT 参数_位置, POINT 参数_尺寸, int 参数_ID, int 参数_窗口风格, int 参数_扩展风格)
{
	HINSTANCE hInstance = zyEnv::getInstance().getHandle();
	MyRegisterClass(hInstance, L"zyPanel", 0, 0, 0);
	
	if (参数_ID == NULL)
		参数_ID = 黑月默认ID();
	HWND hwnd = 参数_父窗口;
	if (参数_窗口风格 == 0)
		参数_窗口风格 = WS_VISIBLE;
	// 默认-1,-1才居中，有坐标了就无需计算，位置要挪到任务栏显示的窗口创建之前
	if (参数_位置.x == -1 && 参数_位置.y == -1) {
		_开始位置到坐标(hwnd, (INT)GetMember(L"StartPosition"), 参数_尺寸, 参数_位置, 0);
		参数_位置.x = MulDiv(参数_位置.x, 96, zyEnv::getInstance().getDpiForWindow());
		参数_位置.y = MulDiv(参数_位置.y, 96, zyEnv::getInstance().getDpiForWindow());
	}

	return _CreateWindow(hwnd, 参数_标题, 参数_位置, 参数_尺寸, (HMENU)(INT_PTR)参数_ID, 参数_窗口风格| WS_CHILD | WS_CLIPCHILDREN | WS_EX_CONTROLPARENT, 参数_扩展风格, L"zyPanel");
}
BOOL DarkMoonUI::zyPanel::创建(zyWindow& 参数_父窗口, const std::wstring& 参数_标题, POINT 参数_位置, POINT 参数_尺寸, int 参数_ID, int 参数_窗口风格, int 参数_扩展风格)
{
	HINSTANCE hInstance = zyEnv::getInstance().getHandle();
	MyRegisterClass(hInstance, L"zyPanel", 0, 0, 0);
	if (参数_ID == NULL)
		参数_ID = 黑月默认ID();
	HWND hwnd = 参数_父窗口.getHwnd();
	if (参数_窗口风格 == 0)
		参数_窗口风格 = WS_VISIBLE;
	// 默认-1,-1才居中，有坐标了就无需计算，位置要挪到任务栏显示的窗口创建之前
	if (参数_位置.x == -1 && 参数_位置.y == -1) {
		_开始位置到坐标(hwnd, (INT)GetMember(L"StartPosition"), 参数_尺寸, 参数_位置, 0);
		参数_位置.x = MulDiv(参数_位置.x, 96, zyEnv::getInstance().getDpiForWindow());
		参数_位置.y = MulDiv(参数_位置.y, 96, zyEnv::getInstance().getDpiForWindow());
	}

	return _CreateWindow(hwnd, 参数_标题, 参数_位置, 参数_尺寸, (HMENU)(INT_PTR)参数_ID, 参数_窗口风格 | WS_CHILD | WS_CLIPCHILDREN | WS_EX_CONTROLPARENT, 参数_扩展风格, L"zyPanel");
}
bool DarkMoonUI::zyPanel::创建自资源(HWND 参数_父窗口, const std::wstring& 参数_资源ID, const std::wstring& 参数_类名)
{
	return _CreateDialogFromRC(参数_父窗口, 参数_资源ID, 参数_类名);
}
int DarkMoonUI::zyPanel::边框(int 参数_边框) {//返回"控件边框_"开头常量
	int Border = (int)GetMember(L"Border");
	SetMember(L"Border", 参数_边框);
	if (isWindow()) {
		HWND hWnd = 取窗口句柄();
		int style = (int)GetWindowLongPtr(hWnd, GWL_STYLE);
		int exStyle = (int)GetWindowLongPtr(hWnd, GWL_EXSTYLE);
		_设置控件边框(参数_边框, style, exStyle);
		SetWindowLongPtr(hWnd, GWL_STYLE, style);
		SetWindowLongPtr(hWnd, GWL_EXSTYLE, exStyle);
		SetWindowPos(hWnd, 0, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED);
	}
	return Border;
}